package common;

// 队列和循环队列
public class ArrayQueue {
    public int l;
    public int r;
    public int size;
    public int[] arr;
    public int limit;

    public ArrayQueue(int k) {
        arr = new int[k];
        size = l = r = 0;
        limit = k;
    }

    // 入队
    public boolean offer(int e) {
        // 满了就不继续加了
        if (isFull()) {
            return false;
        } else {
            // 如果没有满
            arr[r] = e; // 添加元素
            // 但r已经走到limit-1位置，则需要用循环使用链表
            r = r == limit - 1 ? 0 : (r + 1);
            size++;
            return true;
        }
    }

    // 弹出队列,没有数组则返回null
    public Integer poll() {
        if (isEmpty()) {
            return null;
        } else {
            //
            l = l == limit - 1 ? 0 : (l + 1);
            size--;
            return arr[l];
        }
    }

    // 队列头
    public int peek() {
        if (isEmpty()) {
            return -1;
        } else {
            return arr[l];
        }
    }

    // 队列尾部
    public int tail() {
        if (isEmpty()) {
            return -1;
        } else {
            return arr[r == 0 ? (limit - 1) : (r - 1)];
        }

    }

    public boolean isEmpty() {
        return size == 0;
    }

    public boolean isFull() {
        return size == limit;
    }

    public int size() {
        return r - l;
    }
}

